package permission

import (
	"fmt"
	"strconv"
	"x-admin/backend/pkg/response"

	"github.com/gin-gonic/gin"
)

// Handler 权限处理器
type Handler struct {
	service Service
}

// NewHandler 创建权限处理器
func NewHandler(service Service) *Handler {
	return &Handler{
		service: service,
	}
}

// Create 创建权限
// @Summary 创建权限
// @Description 创建新的权限
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param permission body CreateRequest true "权限信息"
// @Success 200 {object} response.Response{data=Permission} "创建成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions [post]
func (h *Handler) Create(c *gin.Context) {
	var req CreateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	permission, err := h.service.Create(&req)
	if err != nil {
		// Service 层已经处理了所有业务逻辑验证，直接返回错误信息
		response.BadRequest(c, err.Error())
		return
	}

	response.SuccessWithMessage(c, "创建权限成功", permission)
}

// GetByID 根据ID获取权限
// @Summary 获取权限详情
// @Description 根据ID获取权限详细信息
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "权限ID"
// @Success 200 {object} response.Response{data=Permission} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "权限不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions/{id} [get]
func (h *Handler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的权限ID")
		return
	}

	permission, err := h.service.GetByID(uint(id))
	if err != nil {
		if err.Error() == "权限不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "获取权限失败: "+err.Error())
		return
	}

	response.Success(c, permission)
}

// Update 更新权限
// @Summary 更新权限
// @Description 根据ID更新权限信息
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "权限ID"
// @Param permission body UpdateRequest true "权限信息"
// @Success 200 {object} response.Response{data=Permission} "更新成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "权限不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions/{id} [put]
func (h *Handler) Update(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的权限ID")
		return
	}

	var req UpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	permission, err := h.service.Update(uint(id), &req)
	if err != nil {
		// Service 层已经处理了所有业务逻辑验证，直接返回错误信息
		response.BadRequest(c, err.Error())
		return
	}

	response.SuccessWithMessage(c, "更新权限成功", permission)
}

// Delete 删除权限
// @Summary 删除权限
// @Description 根据ID删除权限
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "权限ID"
// @Success 200 {object} response.Response "删除成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "权限不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions/{id} [delete]
func (h *Handler) Delete(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的权限ID")
		return
	}

	if err := h.service.Delete(uint(id)); err != nil {
		if err.Error() == "权限不存在" {
			response.NotFound(c, err.Error())
			return
		}
		if err.Error() == "存在子权限，无法删除" {
			response.BadRequest(c, err.Error())
			return
		}
		response.InternalServerError(c, "删除权限失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "删除权限成功", nil)
}

// List 获取权限列表
// @Summary 获取权限列表
// @Description 分页获取权限列表
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Param keyword query string false "关键词搜索"
// @Param name query string false "权限名称"
// @Param display_name query string false "显示名称"
// @Param type query string false "权限类型"
// @Param parent_id query int false "父权限ID"
// @Param status query int false "状态"
// @Success 200 {object} response.PageResponse{data=[]Permission} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions [get]
func (h *Handler) List(c *gin.Context) {
	var req QueryRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 添加调试日志
	fmt.Printf("权限列表查询参数: Page=%d, PageSize=%d, Keyword=%s, Status=%v\n",
		req.Page, req.PageSize, req.Keyword, req.Status)

	permissions, total, err := h.service.List(&req)
	if err != nil {
		response.InternalServerError(c, "获取权限列表失败: "+err.Error())
		return
	}

	fmt.Printf("查询到权限数量: %d, 总数: %d\n", len(permissions), total)

	response.Page(c, permissions, total, req.Page, req.PageSize)
}

// GetTree 获取权限树
// @Summary 获取权限树
// @Description 获取权限树结构
// @Tags 权限管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]PermissionTree} "获取成功"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions/tree [get]
func (h *Handler) GetTree(c *gin.Context) {
	tree, err := h.service.GetTree()
	if err != nil {
		response.InternalServerError(c, "获取权限树失败: "+err.Error())
		return
	}

	response.Success(c, tree)
}

// GetAllPermissions 获取所有权限
// @Summary 获取所有权限
// @Description 获取所有启用的权限（用于下拉选择）
// @Tags 权限管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]Permission} "获取成功"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /permissions/all [get]
func (h *Handler) GetAllPermissions(c *gin.Context) {
	permissions, err := h.service.GetAllPermissions()
	if err != nil {
		response.InternalServerError(c, "获取权限列表失败: "+err.Error())
		return
	}

	response.Success(c, permissions)
}
